package com.ys.service.sys.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bo.enume.sys.StatusEnum;
import com.ys.entity.finance.TcwUserPointRunning;
import com.ys.entity.sys.YsDict;
import com.ys.mapper.sys.SysMapper;
import com.ys.mapper.sys.YsDictMapper;
import com.ys.service.sys.YsDictService;
import com.ys.vo.R;
import com.ys.vo.W;

@Service("ysDictService")
public class YsDictServiceImpl implements YsDictService {

	@Autowired
	private SysMapper sysMapper;
	@Autowired
	private YsDictMapper ysDictMapper;

	@Override
	public R deleteTrue(Long id) {
		
		YsDict entity = new YsDict().setId(id).queryFirst();
		
		// 验证积分类型存在数据则不能删除
		if (entity.getDictKey().equals("TCW_UserPointRunning-Item")) {
			Integer num = new TcwUserPointRunning().setItem(entity.getDictValue()).count();
			if (num > 0) {
				return R.error("存在此类型流水，无法删除");
			}
		}
		
		ysDictMapper.deleteTrue(id);
		return R.ok();
	}

	@Override
	public String toResort(Model model, String dictKey) {
		
		if (dictKey == null) {
			return W.error(model, "KEY不能为空");
		}
		
		List<YsDict> listEntity = new YsDict()
				.setDictKey(dictKey).setOrderby("A.SortNo asc").queryList();;
		
		List<ToResortDto.RowDto> rows = new ArrayList<ToResortDto.RowDto>();
		for(YsDict entity : listEntity) {
			Long id = entity.getId();
			String name = entity.getDictName();
			rows.add(new ToResortDto.RowDto(id, name));
		}
		
		ToResortDto dto = new ToResortDto(rows);
		model.addAttribute("dto", dto);
		return "sys/ysDict/toResort";
	}

	@Override
	@Transactional
	public R resort(String rows) {
		JSONArray JA = JSON.parseArray(rows);
		
		for (int i = 0; i < JA.size(); i++) {
			JSONObject JO = JA.getJSONObject(i);
			Long id = JO.getLong("id");
			Integer sortNo = i + 1;
			sysMapper.updateSortNoById(new YsDict().generateTableAllName(), id, sortNo);
		}
		return R.ok();
	}

	@Override
	public String toAdd(Model model, String dictKey) {
		
		ToAddDto dto = new ToAddDto(dictKey);

		model.addAttribute("dto", dto);
		return "sys/ysDict/toAdd";
	}

	@Override
	public String toEdit(Model model, Long id) {
		
		YsDict entity = new YsDict().setId(id).queryFirst();
		
		String dictKey = entity.getDictKey();
		String dictName = entity.getDictName();
		String dictValue = entity.getDictValue();
		ToEditDto dto = new ToEditDto(id, dictKey, dictName, dictValue);

		model.addAttribute("dto", dto);
		return "sys/ysDict/toEdit";
	}

	@Override
	public R add(String dictKey, String dictName, String dictValue) {
		
		if (dictKey == null || dictKey.length() == 0) {
			return R.error("字典编码不能为空");
		}
		
		if (dictValue == null || dictValue.length() == 0) {
			return R.error("字典值不能为空");
		}
		
		if (dictName == null || dictName.length() == 0) {
			return R.error("字典名称不能为空");
		}
		
		// 验证字典唯一性
		if (new YsDict().setDictKey(dictKey).setDictValue(dictValue).count() > 0) {
			return R.error("该字典已存在，不能重复添加");
		}
		
		YsDict entity = null;
		{

			Integer sortNo = sysMapper.getNextYsDictSortNo(dictKey);
			entity = YsDict.ysDict(dictKey, dictName, dictValue, sortNo, StatusEnum.ON_USED.value);
		}
		ysDictMapper.insert(entity);
		
		return R.ok("操作成功");
	}

	@Override
	public R edit(Long id, String dictName, String dictValue) {
		
		if (id == null) {
			return R.error("字典ID不能为空");
		}
		
		YsDict entity = new YsDict().setId(id).queryFirst();
		
		if (dictValue == null || dictValue.length() == 0) {
			return R.error("字典值不能为空");
		}
		
		if (dictName == null || dictName.length() == 0) {
			return R.error("字典名称不能为空");
		}
		
		// 验证字典唯一性
		if (new YsDict().setDictKey(entity.getDictKey()).setDictValue(dictValue).where("A.Id != '" + id + "'").count() > 0) {
			return R.error("该字典已存在，不能重复添加");
		}
		
		// 验证积分类型存在数据则不能修改
		if (entity.getDictKey().equals("TCW_UserPointRunning-Item")) {
			Integer num = new TcwUserPointRunning().setItem(entity.getDictValue()).count();
			if (num > 0) {
				return R.error("存在此类型流水，无法修改");
			}
		}
		
		entity.setDictName(dictName).setDictValue(dictValue);
		ysDictMapper.update(entity);
		
		return R.ok("操作成功");
	}
}
	

